#include "Contact.h"

char * contactGetNom(Contact *pContact)
{
    if (pContact==NULL)
    {
        printf("Le contact n'a pas été alloué \n");
        exit(-1);
    }
    else
    {
        return pContact->Nom;
    }
}


const char * contactGetNom2(const Contact *pContact)
{
    if (pContact==NULL)
    {
        printf("Le contact n'a pas été alloué \n");
        exit(-1);
    }
    else
    {
        return (const char *)pContact->Nom;
    }
}


void contactSetNom(Contact *pContact, const char Nom[])
{
    if (pContact==NULL)
    {
        printf("Le contact n'a pas été alloué \n");
        exit(-1);
    }
    else
    {
        strcpy(pContact->Nom, Nom);
    }
}


char * contactGetPrenom(Contact *pContact)
{
    if (pContact==NULL)
    {
        printf("Le contact n'a pas été alloué \n");
        exit(-1);
    }
    else
    {
        return pContact->Prenom;
    }
}


const char * contactGetPrenom2(const Contact *pContact)
{
    if (pContact==NULL)
    {
        printf("Le contact n'a pas été alloué \n");
        exit(-1);
    }
    else
    {
        return (const char *)pContact->Prenom;
    }
}


void contactSetPrenom(Contact *pContact, const char* Prenom)
{
    if (pContact==NULL)
    {
        printf("Le contact n'a pas été alloué \n");
        exit(-1);
    }
    else
    {
        strcpy(pContact->Prenom, Prenom);
    }
}


char * contactGetMail(Contact *pContact)
{
    if (pContact==NULL)
    {
        printf("Le contact n'a pas été alloué \n");
        exit(-1);
    }
    else
    {
        return pContact->Mail;
    }
}


const char * contactGetMail2(const Contact *pContact)
{
    if (pContact==NULL)
    {
        printf("Le contact n'a pas été alloué \n");
        exit(-1);
    }
    else
    {
        return (const char *)pContact->Mail;
    }
}


void contactSetMail(Contact *pContact, const char* Mail)
{
    if (pContact==NULL)
    {
        printf("Le contact n'a pas été alloué \n");
        exit(-1);
    }
    else
    {
        strcpy(pContact->Mail,Mail);
    }
}


ClefPublique * contactGetClefPublique(Contact *pContact)
{
    if (pContact==NULL)
    {
        printf("Le contact n'a pas été alloué \n");
        exit(-1);
    }
    else
    {
        return pContact->pClefPublique;
    }
}


const ClefPublique * contactGetClefPublique2(const Contact *pContact)
{
    if (pContact==NULL)
    {
        printf("Le contact n'a pas été alloué \n");
        exit(-1);
    }
    else
    {
        return (const ClefPublique *)pContact->pClefPublique;
    }
}


void contactSetClefPublique(Contact *pContact, const mpz_t n1, const mpz_t c1)
{
    if (pContact==NULL)
    {
        printf("Le contact n'a pas été alloué \n");
        exit(-1);
    }
    else
    {
        mpz_set(pContact->pClefPublique->n, n1);
        mpz_set(pContact->pClefPublique->c, c1);
    }
}


int contactComparer(gconstpointer c1, gconstpointer c2)
{
    return strcmp(((Contact*)c1)->Nom, ((Contact*)c2)->Nom);
}


/*Contact* contactCreer()
{
   Contact* r;
   r=(Contact *)malloc(sizeof(Contact));
   mpz_init( r->Clef);
   return r;
}*/


void contactInitialiser(Contact** pContact)
{
    *pContact=(Contact *)malloc(sizeof(Contact));
    ClefPubliqueInitialiser(&((* pContact)->pClefPublique));
}


void contactLiberer(Contact* pContact)
{
    if (pContact==NULL)
    {
        printf("Le contact n'a pas été alloué \n");
        exit(-1);
    }
    else
    {
        ClefPubliqueLiberer(contactGetClefPublique(pContact));
        free(pContact);
        pContact=NULL;
    }
}


void contactSaisir(Contact* pContact)
{
    if (pContact==NULL)
    {
        printf("Le contact n'a pas été alloué \n");
        exit(-1);
    }
    else
    {
        char nom[20];
        printf("nom: \n");
        scanf("%s", nom);
        contactSetNom(pContact, nom);
        char prenom[20];
        printf("prenom: \n");
        scanf("%s", prenom);
        contactSetPrenom(pContact, prenom);
        char mail[30];
        printf("mail: \n");
        scanf("%s", mail);
        contactSetMail(pContact, mail);
        printf("clef publique: \n");
        //gmp_scanf("%Zd %Zd", (pContact->pClefPublique->n), (pContact->pClefPublique->c));
        gmp_scanf("%Zd %Zd", ClefPubliqueGetn(contactGetClefPublique(pContact)), ClefPubliqueGetc(contactGetClefPublique(pContact)));
    }
}


void contactAfficher(const Contact* pContact)
{
    if (pContact==NULL)
    {
        printf("Le contact n'a pas été alloué \n");
        exit(-1);
    }
    else
    {
        printf("nom: %s \n", contactGetNom2(pContact));
        printf("prenom: %s \n", contactGetPrenom2(pContact));
        printf("mail: %s \n", contactGetMail2(pContact));
        gmp_printf("clef: (%Zd, %Zd) \n \n \n", ClefPubliqueGetn2(contactGetClefPublique2(pContact)), ClefPubliqueGetc2(contactGetClefPublique2(pContact)) );
    }
}


void testRegressionContact()
{
    printf("test regression Contact \n");
    Contact *c1;
    contactInitialiser(&c1);
    contactSaisir(c1);
    contactAfficher(c1);
    contactLiberer(c1);
}
